/*
 * Copyright (c) 2019-2029, Dreamlu 卢春梦 (596392912@qq.com & www.dreamlu.net).
 * <p>
 * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p>
 * http://www.gnu.org/licenses/lgpl.html
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.pig4cloud.pig.common.xss.config;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;

import java.util.ArrayList;
import java.util.List;

/**
 * XSS防护配置属性类
 * <p>
 * 用于配置XSS防护的各种参数，包括处理模式、拦截路径等。
 * 支持动态刷新配置
 * </p>
 *
 * @author lengleng
 * @date 2025/05/31
 */
@Getter
@Setter
@RefreshScope
@ConfigurationProperties(PigXssProperties.PREFIX)
public class PigXssProperties {

	/**
	 * 配置前缀常量
	 */
	public static final String PREFIX = "security.xss";

	/**
	 * 是否开启XSS防护功能
	 */
	private boolean enabled = true;

	/**
	 * 是否对文本进行首尾空白字符修剪
	 */
	private boolean trimText = true;

	/**
	 * XSS处理模式
	 * <p>
	 * clear：清理模式（默认），移除危险标签
	 * escape：转义模式，将特殊字符转义
	 * validate：校验模式，发现XSS内容时抛出异常
	 * </p>
	 */
	private Mode mode = Mode.clear;

	/**
	 * 是否美化输出
	 * <p>
	 * 仅在clear模式下有效，开启后会保留换行符
	 * </p>
	 */
	private boolean prettyPrint = false;

	/**
	 * 是否启用HTML实体转义
	 * <p>
	 * 仅在clear模式下有效，开启后会对HTML实体进行转义
	 * </p>
	 */
	private boolean enableEscape = false;

	/**
	 * 需要进行XSS防护的路径模式
	 * <p>
	 * 支持Ant风格的路径匹配，如：/api/**
	 * 若为空则默认拦截所有路径
	 * </p>
	 */
	private List<String> pathPatterns = new ArrayList<>();

	/**
	 * 不需要进行XSS防护的路径模式
	 * <p>
	 * 用于排除特定路径，如上传文件、富文本编辑器等接口
	 * </p>
	 */
	private List<String> pathExcludePatterns = new ArrayList<>();

	/**
	 * XSS处理模式枚举
	 */
	public enum Mode {

		/**
		 * 清理模式：移除危险的HTML标签和属性
		 */
		clear,
		/**
		 * 转义模式：将特殊字符转义为HTML实体
		 */
		escape,
		/**
		 * 校验模式：检测到XSS内容时抛出异常
		 */
		validate;

	}

}
